#include"TM1638.h"
#include "rom/ets_sys.h"
 void init_gpio()
{
    if(init_gpio_flag == 0){
    	printf("开始初始化gpio\n");
		gpio_config_t io_conf = {                    	\
			.pin_bit_mask = (1<<18)|(1<<19)|(1<<21), 	\       
			.mode = GPIO_MODE_INPUT_OUTPUT,         	\
			.pull_down_en = 0,                     		\ 
			.pull_up_en = 1,                      		\  
			.intr_type = GPIO_INTR_DISABLE,				\
		};       
		gpio_config(&io_conf);
		init_gpio_flag++;
		printf("初始化gpio成功\n");
	}
}


 void TM1638_Write(u_char DATA)			//写数据函数
{
	u_char i = 0;
	for(i=0;i<8;i++)
	{
		//CLK=0;
        gpio_set_level(CLK,0);
		if(DATA&0X01)		//取字节的低位d0的布尔值，
			//DIO=1;			//gpio高电平
            gpio_set_level(DIO,1);
		else
			//DIO=0;			//gpio低电平
            gpio_set_level(DIO,0);
		DATA>>=1;
		//CLK=1;
        gpio_set_level(CLK,1);
	}
}

 u_char TM1638_Read(void)					//读数据函数
{
	u_char i;
	u_char temp=0;
	//DIO=1;	//设置为输入
	gpio_set_level(DIO,1);
    for(i=0;i<8;i++)
	{
		temp>>=1;
		//CLK=0;
		gpio_set_level(CLK,0);
        if(gpio_get_level(DIO))
			temp|=0x80;
		//CLK=1;
        gpio_set_level(CLK,1);
	}
	return temp;
}
 void Write_COM(u_char cmd)		//发送命令字
{
	//STB=0;
    gpio_set_level(STB,0);
	TM1638_Write(cmd);
	//STB=1;
    gpio_set_level(STB,1);
}
 u_char Read_key(void)
{
	u_char c[4],i,key_value=0;
	//STB=0;
	gpio_set_level(STB,0);
    TM1638_Write(0x42);		           //读键扫数据 命令
	for(i=0;i<4;i++){		
		c[i]=TM1638_Read();
		//if(c[i])printf("读键%d：%x\t",i,c[i]);
	}
	//STB=1;					           //4个字节数据合成一个字节
	gpio_set_level(STB,1);
    for(i=0;i<4;i++){
		key_value|=c[i]<<i;
		//if(c[i])printf("键值%d：%x\t",i,key_value);
	}
	
	    //将键码转为键号	
	for(i=0;i<8;i++)
		if((0x01<<i)==key_value)
			break;
	return i;		
}

/* u_char Read_key2(void){
	u_char key,key2;
	key=Read_key();
	ets_delay_us(15000);
	if(key<8 && key==Read_key()){
		
	}
	while()
} */
 void Write_DATA(u_char add,u_char DATA)		//指定地址写入数据
{
	Write_COM(0x44);
	//STB=0;
	gpio_set_level(STB,0);
    TM1638_Write(0xc0|add);
	TM1638_Write(DATA);
	//STB=1;
    gpio_set_level(STB,1);
}

 void Write_allLED(u_char LED_flag)					//控制全部LED函数，LED_flag表示各个LED状态
{
	u_char i;
	for(i=0;i<8;i++)
		{
			if(LED_flag&(1<<i))
				//Write_DATA(2*i+1,3);
				Write_DATA(2*i+1,1);
			else
				Write_DATA(2*i+1,0);
		}
}

//TM1638初始化函数
 void init_TM1638(void)
{
	u_char i;
	Write_COM(0x8b);       //亮度 (0x88-0x8f)8级亮度可调
	Write_COM(0x40);       //采用地址自动加1
	//STB=0;		           //
    gpio_set_level(STB,0);
	TM1638_Write(0xc0);    //设置起始地址

	for(i=0;i<16;i++)	   //传送16个字节的数据
		TM1638_Write(0x00);
	//STB=1;
    gpio_set_level(STB,1);
}